import {Vector3} from '../math/Vector3.js'
import {Object3D} from '../core/Object3D.js'
import {LineSegments} from '../objects/LineSegments.js'
import {LineBasicMaterial} from '../materials/LineBasicMaterial.js'
import {Float32BufferAttribute} from '../core/BufferAttribute.js'
import {BufferGeometry} from '../core/BufferGeometry.js'

const _vector = /*@__PURE__*/ new Vector3()

class SpotLightHelper extends Object3D {
  constructor(light, color) {
    super()
    this.light = light
    this.light.updateMatrixWorld()

    this.matrix = light.matrixWorld
    this.matrixAutoUpdate = false

    this.color = color

    const geometry = new BufferGeometry()

    const positions = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1]

    for (let i = 0, j = 1, l = 32; i < l; i++, j++) {
      const p1 = (i / l) * Math.PI * 2
      const p2 = (j / l) * Math.PI * 2

      positions.push(Math.cos(p1), Math.sin(p1), 1, Math.cos(p2), Math.sin(p2), 1)
    }

    geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))

    const material = new LineBasicMaterial({fog: false, toneMapped: false})

    this.cone = new LineSegments(geometry, material)
    this.add(this.cone)

    this.update()
  }

  dispose() {
    this.cone.geometry.dispose()
    this.cone.material.dispose()
  }

  update() {
    this.light.updateMatrixWorld()

    const coneLength = this.light.distance ? this.light.distance : 1000
    const coneWidth = coneLength * Math.tan(this.light.angle)

    this.cone.scale.set(coneWidth, coneWidth, coneLength)

    _vector.setFromMatrixPosition(this.light.target.matrixWorld)

    this.cone.lookAt(_vector)

    if (this.color !== undefined) {
      this.cone.material.color.set(this.color)
    } else {
      this.cone.material.color.copy(this.light.color)
    }
  }
}

export {SpotLightHelper}
